package com.sxhuayuan.parking.service;

import com.sxhuayuan.parking.controller.open.req.ParkInNoticeData;
import com.sxhuayuan.parking.controller.open.req.ParkOutNoticeData;
import com.sxhuayuan.parking.entity.ParkingIn;
import com.sxhuayuan.parking.entity.ParkingLot;
import com.sxhuayuan.parking.exception.ParkException;
import com.sxhuayuan.parking.service.impl.pojo.ParkInNoticeResult;
import com.sxhuayuan.parking.service.impl.pojo.ParkPreOutNoticeResult;

/**
 * 停车业务统一处理<br>
 * 
 * @author gy
 */
public interface ParkService {

	/**
	 * 出场前通知，主要实现：<br>
	 * 1、车场推送出场车辆相关信息到本系统，以实现出口扫码自动获取车牌和费用<br>
	 * 2、无感实时扣费放行<br>
	 * 判断是否需要缴费，是否有无感权限。无需缴费时返回放行；需要缴费时后台会发起扣费，扣费成功会返回放行，否则不放行。<br>
	 * 关于出场接口幂等性，如果使用uniqueId，可以实现幂等性。如果只传入车牌，幂等性不好实现。
	 * 
	 * @param lot
	 * @param data
	 * @return
	 * @throws ParkException
	 */
	ParkPreOutNoticeResult preOutNotice(ParkingLot lot, ParkOutNoticeData data) throws ParkException;

	/**
	 * 出场前通知，主要实现：<br>
	 * 1、车场推送出场车辆相关信息到本系统，以实现出口扫码自动获取车牌和费用<br>
	 * 2、无感实时扣费放行<br>
	 * 
	 * @param lot
	 * @param data
	 * @param isFree
	 * @param isFreeLeav
	 * @return
	 * @throws ParkException
	 */
	ParkPreOutNoticeResult preOutNotice(ParkingLot lot, ParkOutNoticeData data, boolean isFree, boolean isFreeLeav) throws ParkException;

	/**
	 * 无感入场，按优先级别入场，入场成功就保存parkingIn.platform
	 * 
	 * @param in
	 * @return
	 * @throws ParkException
	 */
	ParkingIn partnerpayEnter(ParkingIn in) throws ParkException;

	/**
	 * 入场通知，保存入场记录，如果车场支持无感，同时会调用无感入场
	 * 
	 * @param lot
	 * @param data
	 * @return
	 * @throws ParkException
	 */
	ParkInNoticeResult parkInNotice(ParkingLot lot, ParkInNoticeData data) throws ParkException;
}
